package com.tougutips.comment.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tougutips.comment.dao.CommentDao;
import com.tougutips.comment.entity.Comment;
import com.tougutips.comment.entity.dto.CommentDto;
import com.tougutips.comment.entity.vo.CommentVo;
import com.tougutips.comment.service.CommentService;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * (Comment)表服务实现类
 *
 * @author makejava
 * @since 2022-07-21 18:10:14
 */
@Service("commentService")
public class CommentServiceImpl extends ServiceImpl<CommentDao, Comment> implements CommentService {

    /**
     * 获得所有的评论按固定的数据结构分好只有两层 一层是一级评论 第二层是他里面的评论
     * @author QinYD
     * @date 2022/7/22 17:20 
     * @param comment
     * @return java.util.List<com.tougutips.comment.entity.dto.CommentDto>
     */
    @Override
    public List<CommentDto> pageComment(Comment comment) {

        // 查询出所有的这个作品下的评论 用type和typeId查的
        List<CommentDto> commentDtos = this.baseMapper.selectComment(comment);

        // 用流式编程处理数据 获得最终要返回的数据结构
        List<CommentDto> comments = commentDtos.stream().filter(CommentDto -> {
            // 筛选出所有的 一级评论
            // CommentId代表着回复了谁如果为0就是一级
            return CommentDto.getCommentId() == 0;
        }).map((menu) -> {
            // 给一级评论 增添儿子
            menu.setChildren(getChildrens(menu, commentDtos));
            return menu;
        }).collect(Collectors.toList());

        // 把查询出来以时间 降序（最新）的评论 在用一级评论的儿子数量给一级评论排序 TODO:点赞业务调通后排序还要按点赞数量来
        List<CommentDto> list = comments.stream().sorted((menu1, menu2) -> {
            int i = (menu1.getChildren() == null ? 0 : menu1.getChildren().size()) - (menu2.getChildren() == null ? 0 : menu2.getChildren().size());
            // i<0?1:(i>0?-1:0) 以 降序 i>0?1:(i<0?-1:0) 升序
            return i<0?1:(i>0?-1:0);
        }).collect(Collectors.toList());

        return list;
    }

    // 找到对应一级评论的所有儿子
    private List<CommentDto> getChildrens(CommentDto root,List<CommentDto> all){
        List<CommentDto> collect = all.stream().filter(comment -> {
            // getParent(a,b)方法是找到a的一级评论的id b是所有评论的集合
            // 如果找到的一级评论的id等于 传过来这个根（一级评论）的id 那就返回
            return getParent(comment, all) == root.getId();
        }).sorted((menu1, menu2) ->{
            return (int) (menu1.getCreateTime().getTime() - menu2.getCreateTime().getTime());
        }).collect(Collectors.toList());

        return collect;
    }
    private int getParent(CommentDto root,List<CommentDto> all){
        // 如果是一级评论就返回0 id从1开始不会不误匹配
        if(root.getCommentId()==0){
            return 0;
        }
        List<CommentDto> collect = all.stream().filter(comment -> {
            return root.getCommentId().equals(comment.getId());
        }).collect(Collectors.toList());

        if (collect.get(0).getCommentId()!=0){
            return getParent(collect.get(0), all);
        }
        return collect.get(0).getId();
    }


}

